package com.young4j.xinsuiwutuobang.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 反射工具类
 * 
 * 使用ClassHelper类可以获取所加载的类，但无法通过类来实例化对象。因此，
 * 需要提供一个反射工具类，让它封装反射相关的API，对外提供更好的工具方法。
 * @author Administrator
 *
 */
public final class ReflectionUtils {
	private static final Logger LOGGER = LoggerFactory.getLogger(ReflectionUtils.class);
	/**
	 * 创建实例
	 * 
	 * 反射api中的类类型变量.newInstance()
	 * @param cls
	 * @return
	 */
	public static Object newInstance(Class<?> cls){
		Object instance;
		try {
			instance = cls.newInstance();
		} catch (Exception e) {
			LOGGER.error("new instance failure",e);
			throw new RuntimeException(e);
		}
		return instance;
	}
	/**
	 * 调用方法
	 * 
	 * method.setAccessible(true) setAccessible(true)用在方法上则可调用在类的private方法
	 * 用在成员变量上则可调用private成员变量
	 * @param obj 类
	 * @param method 方法
	 * @param args 参数
	 * @return
	 */
	public static Object invokeMethod(Object obj,Method method,Object...args){
		Object result;
		try {
			method.setAccessible(true);
			result = method.invoke(obj, args);
		} catch (Exception e) {
			LOGGER.error("invoke method failure",e);
			throw new RuntimeException(e);
		}
		return result;
	}
	public static void setField(Object obj,Field field,Object value){
		try {
			field.setAccessible(true);
			field.set(obj, value);
		} catch (Exception e) {
			LOGGER.error("set field failure",e);
			throw new RuntimeException(e);
		}
	}
}
